package com.city.itis.action;

import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import javax.annotation.Resource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Controller;

import com.city.itis.domain.Hobby;
import com.city.itis.domain.Member;
import com.city.itis.domain.MemberCategory;
import com.city.itis.service.HobbyService;
import com.city.itis.service.MemberCategoryService;
import com.city.itis.service.MemberService;
import com.city.itis.service.SiteService;
import com.city.itis.util.Constants;
import com.city.itis.util.PopupAuthenticator;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;


/**
 * 会员Action
 * @author WY
 *
 */

@Controller

public class MemberAction extends ActionSupport implements ModelDriven<Member>
{

	private static final long serialVersionUID = 1L;	//系统自动生成的版本序列号
	
	private List<Member> memberList=null; //申明memberList对象
	private Member member=new Member();	//定义member对象
	private String command=null; //用于判断执行的动作
	private MemberService memberService;	//声明memberService
	private MemberCategoryService memberCategoryService;	//声明memberCategoryService
	private List<MemberCategory> memberCategoryList=null;
	private HobbyService hobbyService;	//声明hobbyService
	private SiteService siteService;	//声明siteService
	private List<Hobby> hobbyList=null;
	private String dealPhoto=null;	//对图片的处理动作
	private	File photo; 	//声明上传文件photo 
	private String photoFileName;	//声明上传文件名称
	private String photoContentType;	//声明上传文件类型
	Map<String,Object>map=null;		//申明map对象
	private String url=null;	//转向地址
	private String msg=null;	//存放信息
	private List<Integer>hobbyIds=new ArrayList<Integer>();		//定义hobbyIds列表对象，存放爱好编号列表
	private Set<Hobby> hobbys=null; 	//申明hobbysSet集合对象，存放爱好集合
	private int hids[]=null; 	//申明hibs变量，存放会员编号
	private String result=null;	//定义字符串类型变量，用户存放结果信息。
	
	/**
	 * 显示添加方法
	 * @return
	 */
	public String show_add()throws Exception
	{
		
		memberCategoryList=memberCategoryService.findAll();	//查询所有会员类别方法
		
		hobbyList=hobbyService.findAll();	//调用查询所有爱好方法
		
		//判断memberCategoryList和hobbyList是否为null
		if(memberCategoryList!=null&&hobbyList!=null) 
		{
			url="/member/member_add.jsp";	//设置转向地址
			
			return SUCCESS;
		}
		return ERROR;
	}
	
	/**
	 * 添加方法
	 * @return
	 */
	public String add()throws Exception
	{
		member.setPhotoName(photoFileName);	//将上传的图片设置到member对象中
		
		member.setSignupDate(new Date());   //将会员注册时间设置到member对象中
		
		member.getCategory().setId(member.getMemberCategoryNo());	//设置会员类别编号
		
		hobbys=new HashSet<Hobby>();	//创建hobbys对象
		
		//遍历从表单取得hobbyIds列表
		for(Integer id:hobbyIds)
		{
			Hobby hobby=hobbyService.getHobbyById(id);	//根据爱好编号，查询爱好信息。
			
			hobbys.add(hobby);	//将爱好对象信息设置到hobbysSet集合中
		}
		
		member.setHobbys(hobbys);	//将hobbys设置到member对象中
		
		//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败) 
		int flag=memberService.add(member);	//调用会员添加方法
		
		if(flag>0)	//添加成功
		{
			if(member.getPhotoName()!=null)
			{
				save_photo();	//调用保存图片方法
				
			}
			url="/member/list.action";
			return SUCCESS; 
		}else	//添加失败
		{
			return ERROR;
		}
		
	}
	
	
	/**
	 * 修改方法
	 * @return
	 */
	public String modify()throws Exception
	{
		
			if(dealPhoto.equals(Constants.MODIFY)) //执行对图片修改动作
			{
				save_photo();	//调用保存图片方法
				
				member.setPhotoName(photoFileName);	//将上传图片的名称设置到member对象中
				
			}else if(dealPhoto.equals(Constants.DELETE))	//执行对图片删除动作
			{
				delete_photo();	//调用删除图片方法
				
				member.setPhotoName(null);	//将member对象中photoName=null
			}else 
			{
				//执行保存图片动作
				member.setPhotoName(member.getPhotoName());
			}
			
			Integer memberCategoryNo=member.getMemberCategoryNo();	//从表单中取得会员类别编号
			
			if(memberCategoryNo!=null)	//判断会员编号是否为空
			{
				Member m=memberService.getMemberById(member.getId());	//根据会员编号，查询会员方法。	
				
				if(!memberCategoryNo.equals(m.getCategory().getId()))	//判断修改前会员类别编号和从表单取得的会员编号是否相同。
				{
					member.setLevel(1);	//此时会员的类别发生改变，所以需要将会员级别设置到1级
				}else
				{
					member.setLevel(m.getLevel());	//会员级别不变
				}
				
				hobbys=new HashSet<Hobby>();//将hobbys设置到member对象中
				
				//遍历从表单取得hobbyIds列表
				for(Integer id:hobbyIds)
				{
					Hobby hobby=hobbyService.getHobbyById(id);	//根据爱好编号，查询爱好信息。
					
					hobbys.add(hobby);	//将爱好对象信息设置到hobbysSet集合中
				}
				member.setHobbys(hobbys);	//将hobbys设置到member对象中
				
				member.getCategory().setId(memberCategoryNo);	//设置会员类别编号
			
				int flag=memberService.modify(member);	//执行修改会员信息方法
				
				//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败) 
				if(flag>0)
				{
					url="/member/list.action";	//设置转向地址
						
					return SUCCESS;
				}else
				{
					return ERROR;
				}
				
			}else
			{
				Member m=memberService.getMemberById(member.getId());	//根据会员编号，查询会员方法
				
				hobbys=new HashSet<Hobby>();//将hobbys设置到member对象中
				
				//遍历从表单取得hobbyIds列表
				for(Integer id:hobbyIds)
				{
					Hobby hobby=hobbyService.getHobbyById(id);	//根据爱好编号，查询爱好信息。
					
					hobbys.add(hobby);	//将爱好对象信息设置到hobbysSet集合中
				}
				member.setHobbys(hobbys);	//将hobbys设置到member对象中
				
				member.getCategory().setId(m.getCategory().getId());	//设置会员类别编号
				
				int flag=memberService.modify(member);	//执行修改会员信息方法
				
				//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败) 
				if(flag>0)
				{
					url="/member/detail.action";	//设置转向地址
					
					return SUCCESS;
				}else
				{
					return ERROR;
				}
					
			}
		
	}
	
	
	
	/**
	 * 删除方法
	 * @return
	 */
	public String delete() //throws Exception
	{
		try{
			
		
		member.getCategory().setId(member.getMemberCategoryNo());	//设置会员类别编号
		
		siteService.deleteByMemberId(member.getId());
		int flag=memberService.delete(member);	//调用会员信息删除方法
		
		//判断是否添加成功 (flag>0:表示添加成功，flag<0:表示添加失败) 
		if(flag>0)
		{
			//判断会员头像是否存放
			if(member.getPhotoName()!=null)
			{
				delete_photo();	//调用删除图片方法
				
			}
			url="/member/list.action";	//设置转向地址
			
			return SUCCESS;
		}else
		{
			return ERROR;
		}
		}catch(Exception e)
		{
			e.printStackTrace();
		}
		return NONE;
		
	}
	
	/**
	 * 根据用户编号，查询用户信息
	 * @return
	 */
	public String find() throws Exception
	{
		memberCategoryList=memberCategoryService.findAll();	//查询所有会员类别方法
		
		member=memberService.getMemberById(member.getId()); //根据会员编号，提到查询会员方法
		
		//判断member.getHobbys()是否为null
		if(member.getHobbys()!=null)
		{
			hids= new int[member.getHobbys().size()];	//根据[member.getHobbys().size()创建int类型数组
			
			int i=0;	//定义变量
			
			//遍历爱好对象
			for(Hobby h:member.getHobbys())
			{
				hids[i]=h.getId(); 	//将爱好的编号设置hids
				
				i++;	//i自加
			}
		}
		
		
		hobbyList=hobbyService.findAll();	//调用查询所有爱好方法
		
		//判断memberCategoryList、member、hobbyList是否为null 
		if(memberCategoryList!=null&&member!=null&&hobbyList!=null)
		{
			//判断是执行修改、删除、还是明细操作
			if(Constants.MODIFY.equals(command))
			{
				url="/member/member_modify.jsp";	//设置转向地址
				
				return SUCCESS;
			}else if(Constants.DELETE.equals(command)) 
			{
				url="/member/member_delete.jsp";	//设置转向地址
				
				return SUCCESS;
			}else if(Constants.DETAIL.equals(command))
			{
				url="/member/member_detail.jsp";	//设置转向地址
				
				return SUCCESS;
			}
			else
			{
				return NONE;
			}
		
		}
		return ERROR;
	}
	
	public String getMemberByMemberId()throws Exception
	{
		 Member m=memberService.getMemberByMemberId(member.getMemberId());	//根据会员账号，调用查询会员信息方法。
		 
		 if(m!=null)
		 {
			 
			result="用户账号已经存在，请使用别的账号注册。";
		
		 }else
		 {
			result="恭喜您，该账号可用。";
			
		 }
	    
		return SUCCESS;
	}
	
	/**
	 * 根据用户编号，查询用户信息
	 * @return
	 */
	public String detail() throws Exception
	{
		map=ActionContext.getContext().getSession();	//取得Session对象
		
		Member m=(Member) map.get("login_user");	//从Session中取得会员登陆信息
		
		Integer id=m.getId();	//取得会员编号
		
		member=memberService.getMemberById(id);	//根据会员编号，查询会员信息。
		
		//判断会员信息是否为null
		if(member!=null)
		{
			hobbyList=hobbyService.findAll();	//调用查询所有爱好方法
			
			//判断member.getHobbys()是否为null
			if(member.getHobbys()!=null)
			{
				hids= new int[member.getHobbys().size()];	//根据[member.getHobbys().size()创建int类型数组
				
				int i=0;	//定义变量
				
				//遍历爱好对象
				for(Hobby h:member.getHobbys())
				{
					hids[i]=h.getId(); 	//将爱好的编号设置hids
					
					i++;	//i自加
				}
			}
			url="/member/member_detail.jsp";	//设置转向地址
			
			return SUCCESS;
		}else
		{
			return ERROR;
		}
		
		
		
	}

	/**
	 * 查询所有用户信息
	 * @return
	 */
	public String list() throws Exception
	{
		memberList=memberService.findAll();	//调用取得所有会员信息方法
		
		//判断memberList是否为null
		if(memberList!=null)
		{
			url="/member/member_maint.jsp";	//设置转向地址
			
			return SUCCESS;
		}else 
		{
			return ERROR;
		}
	}
	
	
	 /**
     * 保存图片方法
     */
	public void save_photo() throws Exception 
	{
		
		String realPath=ServletActionContext.getServletContext().getRealPath("/upload");	//取得项目中upload文件的路径
		
		//判断上传的文件是否为null
		if(photo!=null)
		{
			
			File saveFile= new File(new File(realPath),photoFileName);	//根据创建文件名称上传的图片名称
			//如果upload文件不存在，将会自动创建。
			if(!saveFile.getParentFile().exists())
			{
				saveFile.getParentFile().mkdirs();
			}
			
			FileUtils.copyFile(photo, saveFile);	//调用FileUtils.copyFile方法
		}
				
	}
	
	/**
	 * 删除图片方法
	 */
	public void delete_photo()throws Exception
	{
		
		String realPath=ServletActionContext.getServletContext().getRealPath("/upload");	//取得项目中upload文件的路径
		
		//判断图片的名字是否为null
		if(member.getPhotoName()!=null)
		{
			
			File deleteFile= new File(new File(realPath),member.getPhotoName());	//根据创建删除文件，名字就是图片的名字。
			
			//如果upload文件不存在，将会自动创建。
			if(!deleteFile.getParentFile().exists())
			{
				deleteFile.getParentFile().mkdirs();
			}
			
			//判断所删除文件是否为null
			if(deleteFile!=null)
			{
					
				deleteFile.delete();	//调用delete方法
			}
				
		}
		
		
	}
	
	
	/**
	 * 会员注册方法
	 * @return
	 * @throws Exception
	 */
	public String register()throws Exception
	{
	
		member.setPhotoName(photoFileName);	//将上传的图片设置到member对象中
		
		member.setSignupDate(new Date());   //将会员注册时间设置到member对象中
		
		hobbys=new HashSet<Hobby>();	//创建hobbys对象
		
		//遍历从表单取得hobbyIds列表
		for(Integer id:hobbyIds)
		{
			Hobby hobby=hobbyService.getHobbyById(id);	//根据爱好编号，查询爱好信息。
			
			hobbys.add(hobby);	//将爱好对象信息设置到hobbysSet集合中
		}
		
		member.setHobbys(hobbys);	//将hobbys设置到member对象中
		
		member.setHobbys(hobbys);	//将hobbys对象设置到member对象中
		
		member.getCategory().setId(1);	//设置会员类别 （普通会员级别编号都为1）
		
		
		member.setLevel(1);	//设置会员级别
		
		int flag=memberService.add(member);	//调用会员添加方法
		
		if(flag>0)	//添加成功
		{
			//判断会员头像是否为null
			if(member.getPhotoName()!=null)
			{
				save_photo();	//调用保存图片方法
				
			}
			msg="恭喜您，你已经添加成我们的会员。赶快去登陆本系统吧！！！";		//设置提示信息
			
			url="/member/member_alert.jsp";	//设置转向地址
			
			return SUCCESS; 
			
		}else	//添加失败
		{
			return ERROR;
		}
		
	}
	
	/**
	 * 会员注册确认方法
	 * @return
	 * @throws Exception
	 */
	public String confirm_register()throws Exception
	{
		return SUCCESS;
	}


	public void send_mail()throws Exception
	{
		   String username="stark_summer@sina.com";
		   String password="stark_summer";
		   String smtp_server="smtp.sina.com";
		   String from_mail_address=username;
		   String to_mail_address=member.getEmail();
		  
		   PopupAuthenticator auth = new PopupAuthenticator(username,password);

		   Properties mailProps = new Properties();
		   mailProps.put("mail.smtp.auth", "true");

		   mailProps.put("username", username);

		   mailProps.put("password", password);

		   mailProps.put("mail.smtp.host", smtp_server);
		   Session mailSession = Session.getDefaultInstance(mailProps,auth);
		   MimeMessage message = new MimeMessage(mailSession);
		   message.setFrom(new InternetAddress(from_mail_address));
		   message.setRecipient(Message.RecipientType.TO, new InternetAddress(to_mail_address));
		   message.setSubject("Mail Test");

		   MimeMultipart multi = new MimeMultipart();
		   BodyPart textBodyPart = new MimeBodyPart();
		   textBodyPart.setText("电子邮件测试内容!");
		   multi.addBodyPart(textBodyPart);
		   message.setContent(multi);
		   message.saveChanges();
		   Transport.send(message); 
		
	}
	
	
    //以下都是Get和Set方法
	public List<Member> getMemberList() {
		return memberList;
	}


	public void setMemberList(List<Member> memberList) {
		this.memberList = memberList;
	}


	public Member getMember() {
		return member;
	}


	public void setMember(Member member) {
		this.member = member;
	}


	public String getCommand() {
		return command;
	}


	public void setCommand(String command) {
		this.command = command;
	}


	public MemberService getMemberService() {
		return memberService;
	}

	@Resource
	public void setMemberService(MemberService memberService) {
		this.memberService = memberService;
	}


	public String getDealPhoto() {
		return dealPhoto;
	}


	public void setDealPhoto(String dealPhoto) {
		this.dealPhoto = dealPhoto;
	}


	public File getPhoto() {
		return photo;
	}


	public void setPhoto(File photo) {
		this.photo = photo;
	}


	public String getPhotoFileName() {
		return photoFileName;
	}


	public void setPhotoFileName(String photoFileName) {
		this.photoFileName = photoFileName;
	}


	public String getPhotoContentType() {
		return photoContentType;
	}


	public void setPhotoContentType(String photoContentType) {
		this.photoContentType = photoContentType;
	}


	@Override
	public Member getModel() {
		return member;
	}

	public MemberCategoryService getMemberCategoryService() {
		return memberCategoryService;
	}
	@Resource
	public void setMemberCategoyrService(MemberCategoryService memberCategoryService) {
		this.memberCategoryService = memberCategoryService;
	}

	public List<MemberCategory> getMemberCategoryList() {
		return memberCategoryList;
	}

	public void setMemberCategoryList(List<MemberCategory> memberCategoryList) {
		this.memberCategoryList = memberCategoryList;
	}

	@Resource
	public void setMemberCategoryService(MemberCategoryService memberCategoryService) {
		this.memberCategoryService = memberCategoryService;
	}
	
	public HobbyService getHobbyService() {
		return hobbyService;
	}
	@Resource
	public void setHobbyService(HobbyService hobbyService) {
		this.hobbyService = hobbyService;
	}

	public List<Hobby> getHobbyList() {
		return hobbyList;
	}

	public void setHobbyList(List<Hobby> hobbyList) {
		this.hobbyList = hobbyList;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public List<Integer> getHobbyIds() {
		return hobbyIds;
	}

	public void setHobbyIds(List<Integer> hobbyIds) {
		this.hobbyIds = hobbyIds;
	}

	public int[] getHids() {
		return hids;
	}

	public void setHids(int[] hids) {
		this.hids = hids;
	}

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}

	public SiteService getSiteService() {
		return siteService;
	}
	@Resource
	public void setSiteService(SiteService siteService) {
		this.siteService = siteService;
	}
	
	
	
}
